package server

import (
	"encoding/json"
	"errors"
	"fmt"
	"go_self/model"
	"strings"
)

const Prefix = "self_"
const UserSign = "user_token"
const AdminSign = "admin_token"

type UserToken struct {
	Token   string `json:"token" Testing:"token"`
	UserId  int64  `json:"user_id" Testing:"用户ID"`
	IsAdmin int    `json:"is_admin" Testing:"后台管理员:0=否,1=是"`
	//ShopId  int64  `json:"shop_id" Testing:"店铺ID:0=否,1=是"`
}
type AdminToken struct {
	Token   string `json:"token" Testing:"token"`
	AdminId  int64  `json:"user_id" Testing:"用户ID"`

}

// AddToken 生成token
func (t *UserToken) AddToken() error {
	if t.Token == "" {
		return errors.New("token生成错误")
	}
	jsonData, err := json.Marshal(t)
	if err != nil {
		return err
	}
	key := fmt.Sprintf("%v_%v", t.UserId,UserSign)
	_, err = model.SelfRedis.Do("SETEX", Prefix+key, 3600*24*3, string(jsonData)).Result()
	if err != nil {
		return err
	}
	return nil
}

func  UserGetToken(token string) (*UserToken, error) {
	if token == "" {
		return nil, errors.New("缺少token参数")
	}
	stringString := strings.Split(token, "-")
	if len(stringString) < 2 {
		return nil, errors.New("token格式错误")
	}
	jsonToken := UserToken{}
	jsonData, err := model.SelfRedis.Do("GET", fmt.Sprintf("%v%v_%v", Prefix, stringString[0],UserSign)).Result()
	if err != nil || jsonData == nil {
		return nil, errors.New("在缓存中没有找到token")
	}
	err = json.Unmarshal([]byte(jsonData.(string)), &jsonToken)
	if err != nil {
		return nil, errors.New("token信息转json错误")
	}
	//验证获取的token是否正确
	//if jsonToken.Token != token {
	//	return nil, errors.New("token输入错误")
	//}
	//重置token时间
	_, _ = model.SelfRedis.Do("EXPIRE", fmt.Sprintf("%v%v_token", Prefix, stringString[0]), 3600*24*3).Result()
	return &jsonToken, nil
}



// AddToken 生成token
func (t *AdminToken) AddToken() error {
	if t.Token == "" {
		return errors.New("token生成错误")
	}
	jsonData, err := json.Marshal(t)
	if err != nil {
		return err
	}
	key := fmt.Sprintf("%v_%v", t.AdminId,AdminSign)
	_, err = model.SelfRedis.Do("SETEX", Prefix+key, 3600*24*3, string(jsonData)).Result()
	if err != nil {
		return err
	}
	return nil
}

func  AdminGetToken(token string) (*AdminToken, error) {
	if token == "" {
		return nil, errors.New("缺少token参数")
	}
	stringString := strings.Split(token, "-")
	if len(stringString) < 2 {
		return nil, errors.New("token格式错误")
	}
	jsonToken := AdminToken{}
	jsonData, err := model.SelfRedis.Do("GET", fmt.Sprintf("%v%v_%v", Prefix, stringString[0],AdminSign)).Result()
	if err != nil || jsonData == nil {
		return nil, errors.New("在缓存中没有找到token")
	}
	err = json.Unmarshal([]byte(jsonData.(string)), &jsonToken)
	if err != nil {
		return nil, errors.New("token信息转json错误")
	}
	//验证获取的token是否正确
	//if jsonToken.Token != token {
	//	return nil, errors.New("token输入错误")
	//}
	//重置token时间
	_, _ = model.SelfRedis.Do("EXPIRE", fmt.Sprintf("%v%v_token", Prefix, stringString[0]), 3600*24*3).Result()
	return &jsonToken, nil
}

